"""
数据库模型定义 (models/db_models.py)

定义MySQL数据库的表结构。
所有应用数据存储在MySQL表中。
"""

import json
import uuid
import logging
from sqlalchemy import Column, String, Integer, Boolean, Text, ForeignKey, DateTime, Table
from sqlalchemy.ext.mutable import MutableList
# 移除MySQL JSON导入，MySQL 5.6不支持JSON类型
# from sqlalchemy.dialects.mysql import JSON
from sqlalchemy.orm import relationship
from sqlalchemy.types import TypeDecorator
from datetime import datetime

from models import Base

# 设置日志
logger = logging.getLogger(__name__)

# 自定义JSON类型，用于存储JSON数据
class JSONList(TypeDecorator):
    """自定义JSON列表类型处理器，用于存储和检索Python列表"""
    impl = Text
    
    def process_bind_param(self, value, dialect):
        """将Python列表转换为JSON字符串存储"""
        if value is not None:
            value = json.dumps(value)
        return value
    
    def process_result_value(self, value, dialect):
        """将JSON字符串转换回Python列表"""
        if value is not None:
            value = json.loads(value)
        return value

# 自定义JSON对象类型，用于存储JSON对象数据
class JSONObject(TypeDecorator):
    """自定义JSON对象类型处理器，用于存储和检索Python字典"""
    impl = Text
    
    def process_bind_param(self, value, dialect):
        """将Python字典转换为JSON字符串存储"""
        if value is not None:
            value = json.dumps(value)
        return value
    
    def process_result_value(self, value, dialect):
        """将JSON字符串转换回Python字典"""
        if value is not None:
            value = json.loads(value)
        return value

# 用户账户表
class User(Base):
    """用户账户数据模型"""
    __tablename__ = 'users'
    
    id = Column(String(36), primary_key=True, default=lambda: str(uuid.uuid4()))
    username = Column(String(50), unique=True, nullable=False)
    email = Column(String(100), unique=True, nullable=False)
    password_hash = Column(String(255), nullable=False)
    role = Column(String(20), default='user')  # 用户角色，默认为普通用户
    is_admin = Column(Boolean, default=False)
    created_at = Column(DateTime, default=datetime.utcnow)
    last_login = Column(DateTime, nullable=True)
    
    # 关系
    uploads = relationship('Upload', back_populates='creator', cascade='all, delete-orphan')
    
    def __repr__(self):
        return f"<User {self.username}>"

# 标签表 - 记录tag关键词的出现次数
class Tag(Base):
    """标签统计数据模型"""
    __tablename__ = 'tags'
    
    id = Column(String(36), primary_key=True, default=lambda: str(uuid.uuid4()))
    name = Column(String(50), unique=True, nullable=False)  # 标签名称
    count = Column(Integer, default=0)  # 标签出现次数
    created_at = Column(DateTime, default=datetime.utcnow)
    last_used = Column(DateTime, default=datetime.utcnow)  # 最后一次使用时间
    
    def __repr__(self):
        return f"<Tag {self.name}: {self.count}>"

# 上传文件模型（同时存储表情数据）
class Upload(Base):
    """上传文件数据模型，同时存储表情数据"""
    __tablename__ = 'uploads'
    
    id = Column(String(36), primary_key=True)  # UUID格式
    original_name = Column(String(255), nullable=False)  # 原始文件名
    saved_name = Column(String(255), nullable=False)     # 保存的文件名
    url = Column(String(255), nullable=False)            # 文件URL
    file_path = Column(String(255), nullable=False)      # 文件路径
    file_size = Column(Integer, nullable=True)           # 文件大小（字节）
    file_type = Column(String(50), nullable=True)        # 文件MIME类型
    date_folder = Column(String(10), nullable=True)      # 日期文件夹 (YYYYMMDD)
    
    # 表情相关字段
    name = Column(String(100), nullable=True)            # 表情名称
    description = Column(Text, nullable=True)            # 表情描述
    thumbnail_id = Column(String(36), nullable=True)     # 缩略图文件ID（可选）
    top_text = Column(String(255), nullable=True)        # 顶部文字
    bottom_text = Column(String(255), nullable=True)     # 底部文字
    likes = Column(Integer, default=0)                   # 点赞数
    
    created_by = Column(String(100), nullable=True)      # 创建者名称
    created_at = Column(DateTime, default=datetime.utcnow)  # 创建时间
    updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)  # 更新时间
    analyzed = Column(Boolean, default=False)            # 是否已分析
    
    # JSON类型字段
    tags = Column(JSONList, default=list)                # 标签列表
    ai_analysis = Column(JSONObject, nullable=True)      # AI分析结果，使用自定义JSONObject存储
    
    # 外键
    creator_id = Column(String(36), ForeignKey('users.id'), nullable=True)  # 创建用户ID
    
    # 关系
    creator = relationship('User', back_populates='uploads')
    
    def __repr__(self):
        return f"<Upload {self.original_name}>"
    
    def to_dict(self):
        """将数据库记录转换为字典格式"""
        return {
            'id': self.id,
            'originalName': self.original_name,
            'savedName': self.saved_name,
            'url': self.url,
            'filePath': self.file_path,
            'fileSize': self.file_size,
            'fileType': self.file_type,
            'date_folder': self.date_folder,
            'name': self.name,
            'description': self.description,
            'thumbnailId': self.thumbnail_id,
            'topText': self.top_text,
            'bottomText': self.bottom_text,
            'likes': self.likes,
            'createdBy': self.created_by,
            'createdAt': self.created_at.isoformat() if self.created_at else None,
            'updatedAt': self.updated_at.isoformat() if self.updated_at else None,
            'analyzed': self.analyzed,
            'tags': self.tags if self.tags else [],
            'ai_analysis': self.ai_analysis
        }

def init_default_data(session):
    """
    初始化默认数据。
    在应用首次运行时添加默认用户。
    """
    # 检查是否有管理员用户
    admin = session.query(User).filter(User.is_admin == True).first()
    
    if not admin:
        from werkzeug.security import generate_password_hash
        
        # 创建默认管理员用户
        admin = User(
            username="admin",
            email="admin@memeking.com",
            password_hash=generate_password_hash("admin123"),
            is_admin=True
        )
        session.add(admin)
        session.commit()
        logger.info("创建了默认管理员用户") 